package com.snail.controller;

import com.snail.result.Result;
import io.minio.*;
import io.minio.errors.MinioException;
import io.minio.http.Method;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

@RestController
@RequestMapping("/minio")
public class MinioController {
    @Autowired
    private  MinioClient minioClient;

    // 上传文件
    @PostMapping("/upload")
    public Result<String> upload(@RequestParam("file") MultipartFile file) {
        if (file != null){
            String fileName = file.getOriginalFilename();
            long size = file.getSize();
            try {
                InputStream inputStream = file.getInputStream();
                //通过stream流来上传图片
                assert fileName != null;
                ObjectWriteResponse oss = minioClient.putObject(
                        PutObjectArgs.builder()
                                .stream(inputStream,size,-1l)
                                .object(fileName)
                                .bucket("mall")
                                .contentType(getContentType(fileName)) // 新增：设置正确的 Content-Type
                                .build()
                );
                //获取文件的访问路径 share分享的url地址
                String url = minioClient.getPresignedObjectUrl(
                        GetPresignedObjectUrlArgs.builder()
                                .method(Method.GET)
                                .bucket("mall")
                                .object(fileName)
                                .build());
                System.out.println("传出的url地址"+url);
                return  Result.success(url);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return Result.failed("没有文件可以上传");
    }

    // 工具方法：根据文件名后缀判断 MIME 类型
    private String getContentType(String fileName) {
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
        return switch (suffix) {
            case "jpg", "jpeg" -> "image/jpeg";
            case "png" -> "image/png";
            case "gif" -> "image/gif";
            // 扩展其他类型（如 svg、webp 等）
            default -> "application/octet-stream";
        };
    }

    /**
     * 删除MinIO中的文件
     * @param objectName 要删除的文件名称（对象名）
     * @throws Exception 可能抛出MinIO操作异常、IO异常等
     */
    public void deleteFile(String objectName) throws Exception {
        try {
            // 调用MinioClient的removeObject方法删除文件
            minioClient.removeObject(
                    RemoveObjectArgs.builder()
                            .bucket("mall")  // 指定桶名
                            .object(objectName)  // 指定要删除的对象名（文件路径/名称）
                            .build()
            );
        } catch (MinioException e) {
            // MinIO服务返回的异常（如桶不存在、对象不存在等）
            throw new Exception("MinIO删除文件失败: " + e.getMessage(), e);
        } catch (IOException e) {
            // IO异常（如网络连接问题）
            throw new Exception("删除文件时IO错误: " + e.getMessage(), e);
        } catch (InvalidKeyException | NoSuchAlgorithmException e) {
            // 密钥或算法异常（通常是配置错误）
            throw new Exception("MinIO认证/算法错误: " + e.getMessage(), e);
        }
    }
}
